package com.ruoyi.system.service.impl;

import com.ruoyi.system.domain.SysRegion;
import com.ruoyi.system.domain.vo.SysRegionVO;
import com.ruoyi.system.mapper.SysRegionMapper;
import com.ruoyi.system.service.ISysRegionService;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.stream.Collectors;

/**
 * 行政区划Service业务层处理
 *
 * @author kerwincui
 * @date 2024-07-29
 */
@Service
public class SysRegionServiceImpl implements ISysRegionService
{
    @Resource
    private SysRegionMapper sysRegionMapper;

    /**
     * 查询行政区划
     *
     * @param code 行政区划主键
     * @return 行政区划
     */
    @Override
    public SysRegion selectSysRegionByCode(String code)
    {
        return sysRegionMapper.selectSysRegionByCode(code);
    }

    /**
     * 查询行政区划列表
     *
     * @param sysRegion 行政区划
     * @return 行政区划
     */
    @Override
    public List<SysRegionVO> selectSysRegionList(SysRegion sysRegion){
        return buildTree(sysRegionMapper.selectSysRegionList(sysRegion));
    }

    private List<SysRegionVO> buildTree(List<SysRegionVO> item) {
        List<SysRegionVO> returnList = new ArrayList<>();
        List<String> tempList = item.stream().map(SysRegionVO::getCode).collect(Collectors.toList());
        for (Iterator<SysRegionVO> iterator = item.iterator(); iterator.hasNext(); ) {
            SysRegionVO sysRegionVO = iterator.next();
            // 如果是顶级节点, 遍历该父节点的所有子节点
            if (!tempList.contains(sysRegionVO.getParentCode())) {
                recursionFn(item, sysRegionVO);
                returnList.add(sysRegionVO);
            }
        }
        if (returnList.isEmpty()) {
            returnList = item;
        }
        return returnList;
    }


    private void recursionFn(List<SysRegionVO> list, SysRegionVO t) {
        // 得到子节点列表
        List<SysRegionVO> childList = getChildList(list, t);
        t.setChild(childList);
        for (SysRegionVO tChild : childList) {
            if (hasChild(list, tChild)) {
                recursionFn(list, tChild);
            }
        }
    }

    private List<SysRegionVO> getChildList(List<SysRegionVO> list, SysRegionVO t) {
        List<SysRegionVO> tlist = new ArrayList<>();
        Iterator<SysRegionVO> it = list.iterator();
        while (it.hasNext()) {
            SysRegionVO n = it.next();
            if (n.getParentCode().equals(t.getCode())) {
                tlist.add(n);
            }
        }
        return tlist;
    }

    private boolean hasChild(List<SysRegionVO> list, SysRegionVO t) {
        return getChildList(list, t).size() > 0;
    }


    /**
     * 新增行政区划
     *
     * @param sysRegion 行政区划
     * @return 结果
     */
    @Override
    public int insertSysRegion(SysRegion sysRegion)
    {
        return sysRegionMapper.insertSysRegion(sysRegion);
    }

    /**
     * 修改行政区划
     *
     * @param sysRegion 行政区划
     * @return 结果
     */
    @Override
    public int updateSysRegion(SysRegion sysRegion)
    {
        return sysRegionMapper.updateSysRegion(sysRegion);
    }

    /**
     * 批量删除行政区划
     *
     * @param codes 需要删除的行政区划主键
     * @return 结果
     */
    @Override
    public int deleteSysRegionByCodes(String[] codes)
    {
        return sysRegionMapper.deleteSysRegionByCodes(codes);
    }

    /**
     * 删除行政区划信息
     *
     * @param code 行政区划主键
     * @return 结果
     */
    @Override
    public int deleteSysRegionByCode(String code)
    {
        return sysRegionMapper.deleteSysRegionByCode(code);
    }
}
